// #include <stdio.h>
// #include <stdlib.h>
// int* fun(int* nums, int size,int* retsize)
// {
//     *retsize=2*size;//retsize的实参值改变
//     int* ret=(int*)malloc(*retsize*sizeof(int));
//     for(int i=0;i<size;i++)
//     {
//         ret[i]=nums[i];
//     }
//     for(int i=0;i<size;i++)
//     {
//         ret[i+size]=nums[i];
//     }
//     return ret;
// }
// int main()//数组串联
// {
//     int nums[]={1,2,1};
//     int size=sizeof(nums)/sizeof(nums[0]);
//     int retsize;
//     int* ret=fun(nums,size,&retsize);//传址可以改变retsize的实参值
//     for(int i=0;i<retsize;i++)
//     {
//         printf("%d ",ret[i]);//1 2 1 1 2 1
//     }
//     free(ret);
//     ret=NULL;
//     return 0;
// }



//力扣原型
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
// int* getConcatenation(int* nums, int numsSize, int* returnSize) {
//     //定义一个长度为nums数组长度两倍的数组ans
//     int* ans = malloc(2*numsSize * sizeof(int));
//     int i = 0;
//     //遍历nums数组，将下标为x的元素分别赋值给ans数组中下标为x和下标为x+m的元素；
//     for(i=0; i<numsSize; i++) {
//         ans[i] = nums[i];
//         ans[i+numsSize] = nums[i];
//     }
//     //更新数组长度并返回数组
//     *returnSize = 2*numsSize;
//     return ans;
// }




/*#include <stdio.h>
#include <stdlib.h>
int main()
{
    int* p3=(int*)calloc(5,sizeof(int));//calloc函数可以初始化数组元素为0
    for(int i=0;i<5;i++)
    {
        printf("%d ",p3[i]);//0 0 0 0 0
    }
    int *p=(int*)malloc(5*sizeof(int));//动态分配内存空间，5个int类型的空间
    printf("\n%p\n",p);
    for(int i=0;i<5;i++)
    {
        p[i]=i+1;
    }
    int *p2=(int*)realloc(p,10*sizeof(int));//拓展p指向的内存空间，拓展到10个int类型的空间
    p=p2;
    printf("%p\n",p);
    for(int i=5;i<10;i++)
    {
        p[i]=i+1;
    }
    for(int i=0;i<10;i++)
    {
        printf("%d ",p[i]); 
    }
    free(p);
    p=NULL;
    return 0;
}*/



#include <stdio.h>
#include <stdlib.h>
int main()//用malloc函数模拟开辟一个3*5的二维数组，开辟好后，使用二维数组的下标访问形式，访问空间
{
    int** p=(int**)malloc(3*sizeof(int*));//开辟一个3行的指针数组，每个指针指向一个一维数组
    for(int i=0;i<3;i++)//开辟每个指针指向的一维数组,每个一维数组有5个int类型的元素
    {
        p[i]=(int*)malloc(5*sizeof(int));
    }
    for(int i=0;i<3;i++)//使用二维数组的下标访问形式，访问空间
    {
        for(int j=0;j<5;j++)
        {
            p[i][j]=i*5+j+1;
        }
    }
    for(int i=0;i<3;i++)//输出二维数组
    {
        for(int j=0;j<5;j++)
        {
            printf("%d ",p[i][j]);
        }
        printf("\n");
    }
    for(int i=0;i<3;i++)//释放每个指针指向的一维数组
    {
        free(p[i]);
        p[i]=NULL;
    }   
    free(p);//释放指针数组
    p=NULL;
    return 0;
}